package org.hilo.boot.core;

import org.jretty.apibase.IMsg;
import org.jretty.util.DateFormatUtils.DateInfo;
import org.jretty.util.IpUtils;

/**
 * 包装给定的IMsg，但是使用特殊的code：
 * See {@link #initCode()}
 * 
 * @author zollty
 */
public class RefMsg implements IMsg {

    private final String code;
    private final IMsg msg;

    public RefMsg() {
        this(BaseMsg.SYSTEM_ERR);
    }

    public RefMsg(IMsg msg) {
        this.code = initCode();
        this.msg = msg;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getMsg() {
        return msg.getMsg();
    }

    @Override
    public String getMsg(String locale) {
        return msg.getMsg(locale);
    }

    @Override
    public String toString(String locale) {
        return code + ": " + msg.getMsg(locale);
    }

    /**
     * 初始化错误代码，为它加上时间截，这样每个错误信息就是全局唯一的 <br>
     * 例如 imYn2 调用一次这个方法后 就变成了 imYn2e-051310381
     * <p>
     * 1、可以根据该code得知错误发生的服务器； 2、可以定位得知错误发生的时间（ddHHmmssS格式）。
     */
    private String initCode() {
        return UT.Algr.shortMsg(getServerId()) + "-" + getFormatDate();
    }

    /** 获取ddHHmmssS格式的日期 */
    private static String getFormatDate() {
        DateInfo dinfo = UT.Date.format();
        StringBuilder sbu = new StringBuilder(9);
        sbu.append(dinfo.getDd());
        sbu.append(dinfo.getHH());
        sbu.append(dinfo.getMm());
        sbu.append(dinfo.getSs());
        sbu.append(dinfo.getSss().charAt(0));
        return sbu.toString();
    }

    private static String getServerId() {
        return IpUtils.getHostName() + "$" + IpUtils.getLocalIP();
    }
}
